﻿//using Spire.Doc;
//using Spire.Doc.Documents;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;

//namespace engine
//{
//    public class IOMapper : IIOMapper
//    {
//        private List<IBuiltinCollection> _builtinCollections;
//        private MiddleData middleData;

//        public IOMapper(IBuiltinCollection builtinCollection)
//        {
//            RegisterBuiltinCollection(builtinCollection);
//        }

//        public void RegisterBuiltinCollection(IBuiltinCollection builtinCollection)
//        {
//            _builtinCollections.Add(builtinCollection);
//        }

//        public MiddleData FromWord(string fileName, string templateName, TemplateConfig templateConfig)
//        {
//            //Document document = new Document(fileName);
//            //Document templateDocument = new Document(templateName);

//            //// 遍历document，发现变量，然后获取数据
//            //ParseWordElement(document, templateDocument);

//            throw new NotImplementedException();
//        }

//        private void ParseWordElement(DocumentObject obj)
//        {
//            switch (obj.DocumentObjectType)
//            {
//                case DocumentObjectType.Document:
//                    {
//                        Document document = obj as Document;
//                        foreach(Section section in document.Sections)
//                        {
//                            ParseWordElement(section);
//                        }
//                        foreach(DocumentObject textbox in document.TextBoxes)
//                        {
//                            ParseWordElement(textbox);
//                        }
//                        break;
//                    }
//                case DocumentObjectType.Section:
//                    {
//                        Section section = obj as Section;
//                        foreach (DocumentObject item in section.Body.ChildObjects)
//                        {
//                            ParseWordElement(item);
//                        }
//                        foreach (DocumentObject item in section.HeadersFooters.Header.ChildObjects)
//                        {
//                            ParseWordElement(item);
//                        }
//                        foreach (DocumentObject item in section.HeadersFooters.Footer.ChildObjects)
//                        {
//                            ParseWordElement(item);
//                        }
//                        break;
//                    }
//                case DocumentObjectType.TextBox:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.Table:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.TableRow:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.TableCell:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.Body:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.Paragraph:
//                    {
//                        // 从段落层面发现变量
//                        //Paragraph paragraph = obj as Paragraph;
//                        // 处理变量
//                        //FindAndParseWordMarker(paragraph);
//                        break;
//                    }
//                case DocumentObjectType.Picture:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.TextRange:
//                    {

//                        break;
//                    }
//            }
//        }

//        private void FindAndParseWordMarker(Paragraph paragraph)
//        {
//            string content = paragraph.Text;

//            for(int begin = 0; begin < content.Length; begin++)
//            {
//                // 发现标记
//                string marker = FindWordMarker(content, ref begin);
//                if(marker != null)
//                {
//                    // 处理标记
//                    ParseWordMarker(marker);
//                }
//            }
//            // 统一替换标记，这里相当于以段落为单位。
//            ReplaceWordMarker(paragraph);

//        }

//        private string FindWordMarker(string content, ref int begin)
//        {
//            return "";
//        }

//        private void ParseWordMarker(string marker)
//        {

//        }

//        private void ReplaceWordMarker(DocumentObject obj)
//        {
//            // 替换需要变量，需要知道当前位置，需要知道文档对象本身
//        }

//        public void ToWord(string templateName, TemplateConfig templateConfig, MiddleData middleData, string outputName)
//        {
//            Document document = new Document(templateName);

//            // 遍历document，发现变量，然后获取数据
//            ParseWordElement(document);

//            throw new NotImplementedException();
//        }
//    }

//    public interface IIOMapper
//    {
//        MiddleData FromWord(string fileName, string templateName, TemplateConfig templateConfig);
//        void ToWord(string templateName, TemplateConfig templateConfig, MiddleData middleData, string outputName);
//    }

//    public class BuiltinCollection : IBuiltinCollection
//    {
//        public void HasFunc(string funcName)
//        {
//            throw new NotImplementedException();
//        }

//        public object Run(string funcName, object[] paras)
//        {
//            throw new NotImplementedException();
//        }
//    }

//    public interface IBuiltinCollection
//    {
//        void HasFunc(string funcName);
//        object Run(string funcName, object[] paras);
//    }

//    public class DocumentReader
//    {
//        private IEnumerator<DocumentObject> _enumerator;

//        private int _pointer;

//        public DocumentReader(DocumentObject obj)
//        {
//            switch (obj.DocumentObjectType)
//            {
//                case DocumentObjectType.TextBox:
//                    {
//                        _enumerator = obj.ChildObjects.GetEnumerator() as IEnumerator<DocumentObject>;
//                        break;
//                    }
//                case DocumentObjectType.Section:
//                    {
//                        _enumerator = obj.ChildObjects.GetEnumerator() as IEnumerator<DocumentObject>;
//                        break;
//                    }
//                case DocumentObjectType.Table:
//                    {
//                        Table table = obj as Table;
//                        _enumerator = table.Rows.GetEnumerator() as IEnumerator<DocumentObject>;
//                        break;
//                    }
//                case DocumentObjectType.TableRow:
//                    {
//                        TableRow tableRow = obj as TableRow;
//                        _enumerator = tableRow.Cells.GetEnumerator() as IEnumerator<DocumentObject>;
//                        break;
//                    }
//            }
//        }

//        public DocumentObject Next()
//        {
//            return null;
//        }
//    }

//    public class FromWordHelper
//    {

//    }

//    public class ToWordHelper
//    {
//        private EngineSetting _engineSetting;
//        private MiddleData _middleData;
//        private string _templateName;
//        private TemplateConfig _templateConfig;
//        private string outputName;

//        private int _deep;
//        private DocumentObject _currentObject;

//        public ToWordHelper(string templateName, TemplateConfig templateConfig, MiddleData middleData, EngineSetting engineSetting)
//        {
//            _engineSetting = engineSetting;
//            _templateName = templateName;
//            _templateConfig = templateConfig;
//            _middleData = middleData;
//        }

//        public void ToWord(string outputName)
//        {
//            Document document = new Document(_templateName);

//            // 遍历document，发现变量，然后获取数据
//            ParseWordElement(document);

//            document.SaveToFile(outputName);
//        }

//        private void ParseWordElement(DocumentObject obj)
//        {
//            switch (obj.DocumentObjectType)
//            {
//                case DocumentObjectType.Document:
//                    {
//                        Document document = obj as Document;
//                        foreach (Section section in document.Sections)
//                        {
//                            ParseWordElement(section);
//                        }
//                        foreach (DocumentObject textbox in document.TextBoxes)
//                        {
//                            ParseWordElement(textbox);
//                        }
//                        break;
//                    }
//                case DocumentObjectType.Section:
//                    {
//                        Section section = obj as Section;
//                        foreach (DocumentObject item in section.Body.ChildObjects)
//                        {
//                            ParseWordElement(item);
//                        }
//                        foreach (DocumentObject item in section.HeadersFooters.Header.ChildObjects)
//                        {
//                            ParseWordElement(item);
//                        }
//                        foreach (DocumentObject item in section.HeadersFooters.Footer.ChildObjects)
//                        {
//                            ParseWordElement(item);
//                        }
//                        break;
//                    }
//                case DocumentObjectType.TextBox:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.Table:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.TableRow:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.TableCell:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.Body:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.Paragraph:
//                    {
//                        // 从段落层面发现变量
//                        Paragraph paragraph = obj as Paragraph;
//                        // 处理变量
//                        FindAndParseWordMarker(paragraph);
//                        break;
//                    }
//                case DocumentObjectType.Picture:
//                    {

//                        break;
//                    }
//                case DocumentObjectType.TextRange:
//                    {

//                        break;
//                    }
//            }
//        }

//        private void FindAndParseWordMarker(Paragraph paragraph)
//        {
//            string content = paragraph.Text;

//            for (int begin = 0; begin < content.Length; begin++)
//            {
//                // 发现标记
//                string marker = FindWordMarker(content, ref begin);
//                if (marker != null)
//                {
//                    // 处理标记
//                    ParseWordMarker(marker);
//                }
//            }
//            // 统一替换标记，这里相当于以段落为单位。
//            ReplaceWordMarker(paragraph);

//        }

//        private string FindWordMarker(string content, ref int begin)
//        {
//            return "";
//        }

//        private void ParseWordMarker(string marker)
//        {

//        }

//        private void ReplaceWordMarker(DocumentObject obj)
//        {
//            // 替换需要变量，需要知道当前位置，需要知道文档对象本身
//            // 如果替换了的话，那么文档结构就被改变了，会不会有问题。应该设置一个指针，每次操作后改变指针的位置。深度值，编辑的对象
//            switch (obj.DocumentObjectType)
//            {
//                case DocumentObjectType.Paragraph:
//                    {

//                        break;
//                    }
//            }
//        }

//        private bool ShouldContinue(DocumentObject documentObject, int deep)
//        {
//            if(deep == _deep && documentObject != _currentObject)
//            {
//                return true;
//            }
//            else
//            {
//                return false;
//            }
//        }

//        private bool ShouldBreak(DocumentObject documentObject, int deep)
//        {
//            if (deep > _deep)
//            {
//                return true;
//            }
//            else
//            {
//                return false;
//            }
//        }
//    }

//    public class EngineSetting
//    {

//    }
//}
